package com.nixelsolutions.realstate;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class DatabaseHelper {
	
	private DataSource pool;
    private Context context;
    
    private String getPortadaDestacadosFijosSQL = "SELECT * FROM Articulos where Portada = 1 AND Portada_Fijo = 1 and Activo = 1 ORDER BY En_Venta, RAND()";
    private String getPortadaDestacadosNoFijosSQL = "SELECT * FROM Articulos where Portada = 1 AND Portada_Fijo = 0 and Activo = 1 ORDER BY En_Venta, RAND()";
    private String getClientesFijosSQL = "SELECT * FROM Clientes where Anunciante=1 AND Anunciante_Fijo=1 AND Activo = 1 ORDER BY RAND()";
    private String getClientesSQL = "SELECT * FROM Clientes";
    private String getZonasSQL = "SELECT * FROM Zonas";
    private String getLocalidadesSQL = "SELECT * FROM Localidades";

	public DatabaseHelper() {
		try {
			context = (Context) new InitialContext().lookup("java:comp/env");
			pool = (DataSource) context.lookup("jdbc/casasencastelldefelsDS");
		} catch (NamingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}	
	}
	
	public Vector<Cliente> getClientes(int type, String cliente) {
		String clientesSQL = null;
		
		switch (type) {
		case Constants.ANUNCIANTE_FIJO:
			clientesSQL = getClientesFijosSQL;
			break;
		case Constants.ANUNCIANTE_NORMAL:
			clientesSQL = getClientesSQL+" WHERE DNI =\""+cliente+"\"";
			break;
		}
		
		Vector<Cliente> clientes = new Vector<Cliente> ();
		Cliente currentClient;
		
		Connection c;
		try {
			c = (Connection) pool.getConnection();
			PreparedStatement ps = (PreparedStatement) c.prepareStatement(clientesSQL);
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				currentClient = new Cliente(rs.getString("DNI"));
				currentClient.setName(rs.getString("Nombre"));
				currentClient.setCity(rs.getString("Localidad_Cliente"));
				currentClient.setAddress(rs.getString("Direccion"));
				currentClient.setPBOX(rs.getString("Cod_Postal"));
				currentClient.setTelephone(rs.getString("Telefono"));
				currentClient.setFax(rs.getString("Fax"));
				currentClient.setMobile(rs.getString("Movil"));
				currentClient.setMail(rs.getString("Mail"));
				currentClient.setContact(rs.getString("Contacto"));
				currentClient.setAds(rs.getInt("Anuncios"));
				currentClient.setLogo(rs.getString("Logo"));
				currentClient.setUser(rs.getString("Usuario"));
				currentClient.setPassword(rs.getString("Contrasena"));
				currentClient.setActive(rs.getInt("Activo"));
				currentClient.setAccessLevel(rs.getString("Nivel_Acceso"));
				currentClient.setAnunciante(rs.getInt("Anunciante"));
				currentClient.setLink(rs.getString("Link_Externo"));
				currentClient.setAnuncianteFijo(rs.getInt("Anunciante_Fijo"));
				
				clientes.add(currentClient);
			}
			c.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return clientes;
	}
	
	public Vector<Inmueble> getInmuebles(int type) {
		String inmueblesSQL = null;
		
		switch (type) {
		case Constants.PORTADA_DESTACADOS:
			inmueblesSQL = getPortadaDestacadosFijosSQL;
			break;
		case Constants.PORTADA_NO_DESTACADOS:
			inmueblesSQL = getPortadaDestacadosNoFijosSQL;
			break;
		}
		
		Vector<Inmueble> inmuebles = new Vector<Inmueble> ();
		Inmueble currentInmueble;
		
		Connection c;
		try {
			c = (Connection) pool.getConnection();
			PreparedStatement ps = (PreparedStatement) c.prepareStatement(inmueblesSQL);
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				currentInmueble = new Inmueble(rs.getString("Referencia"), rs.getString("Ref_Propia"));
				currentInmueble.setCliente(getClientes(Constants.ANUNCIANTE_NORMAL,rs.getString("Cliente")).firstElement());
				currentInmueble.setTipo(rs.getInt("Tipo_Inmueble"));
				currentInmueble.setPortada(rs.getInt("Portada"));
				currentInmueble.setDestacado(rs.getInt("Portada_Fijo"));
				currentInmueble.setVenta(rs.getString("En_Venta"));
				currentInmueble.setNew(rs.getInt("Nueva"));
				currentInmueble.setZonaById(rs.getInt("Zona"));
				currentInmueble.setZona(getZonaById(currentInmueble.getZonaById()));
				currentInmueble.setLocalidad(getLocalidadByZoneId(currentInmueble.getZonaById()));
				currentInmueble.setPrecio(rs.getInt("Precio"));
				currentInmueble.setHabitacionesDobles(rs.getInt("N_Hab_Doble"));
				currentInmueble.setHabitacionesDobles(rs.getInt("N_Suit"));
				currentInmueble.setHabitacionesDobles(rs.getString("O_N_Hab_Doble"));
				currentInmueble.setHabitacionesDobles(rs.getInt("N_Hab_Sencilla"));
				currentInmueble.setHabitacionesDobles(rs.getString("O_N_Hab_Sencilla"));
				currentInmueble.setHabitacionesDobles(rs.getInt("N_Banos"));
				currentInmueble.setHabitacionesDobles(rs.getString("O_N_Banos"));
				currentInmueble.setHabitacionesDobles(rs.getInt("N_Aseos"));
				currentInmueble.setHabitacionesDobles(rs.getString("O_N_Aseos"));
				currentInmueble.setSuperficieP1(rs.getInt("Superficie_P1"));
				currentInmueble.setSuperficieP1(rs.getString("O_Superficie_P1"));
				currentInmueble.setSuperficieP2(rs.getInt("Superficie_P2"));
				currentInmueble.setSuperficieP2(rs.getString("O_Superficie_P2"));
				currentInmueble.setSuperficieP3(rs.getInt("Superficie_P3"));
				currentInmueble.setSuperficieP3(rs.getString("O_Superficie_P3"));
				currentInmueble.setSuperficieP4(rs.getInt("Superficie_P4"));
				currentInmueble.setSuperficieP4(rs.getString("O_Superficie_P4"));
				currentInmueble.setSuperficieP5(rs.getInt("Superficie_P5"));
				currentInmueble.setSuperficieP5(rs.getString("O_Superficie_P5"));
				currentInmueble.setSuperficieTotal(rs.getString("O_Superficie_Total"));
				currentInmueble.setSuperficieSolar(rs.getInt("Superficie_Solar"));
				currentInmueble.setSuperficieSolar(rs.getString("O_Superficie_Solar"));
				currentInmueble.setRecibidor(rs.getInt("Recibidor"));
				currentInmueble.setRecibidor(rs.getString("O_Recibidor"));
				currentInmueble.setCocina(rs.getInt("Cocina"));
				currentInmueble.setCocina(rs.getString("O_Cocina"));
				currentInmueble.setLavadero(rs.getInt("Lavadero"));
				currentInmueble.setLavadero(rs.getString("O_Lavadero"));
				currentInmueble.setComedor(rs.getInt("Comedor"));
				currentInmueble.setComedor(rs.getString("O_Comedor"));
				currentInmueble.setGaraje(rs.getInt("Garaje"));
				currentInmueble.setGaraje(rs.getString("O_Garaje"));
				currentInmueble.setTrastero(rs.getInt("Trastero"));
				currentInmueble.setTrastero(rs.getString("O_Trastero"));
				currentInmueble.setBodega(rs.getInt("Bodega"));
				currentInmueble.setBodega(rs.getString("O_Bodega"));
				currentInmueble.setTerraza(rs.getInt("Terraza"));
				currentInmueble.setTerraza(rs.getString("O_Terraza"));
				currentInmueble.setPiscina(rs.getInt("Piscina"));
				currentInmueble.setPiscina(rs.getString("O_Piscina"));
				currentInmueble.setJardin(rs.getInt("Jardin"));
				currentInmueble.setJardin(rs.getString("O_Jardin"));
				currentInmueble.setCalefaccion(rs.getInt("Calefac"));
				currentInmueble.setCalefaccion(rs.getString("O_Calefac"));
				currentInmueble.setChimenea(rs.getInt("Chimenea"));
				currentInmueble.setChimenea(rs.getString("O_Chimenea"));
				currentInmueble.setGas(rs.getInt("Gas"));
				currentInmueble.setGas(rs.getString("O_Gas"));
				currentInmueble.setAireAcondicionado(rs.getInt("Aire_Acondicionado"));
				currentInmueble.setAireAcondicionado(rs.getString("O_Aire_Acondicionado"));
				currentInmueble.setSistemaSeguridad(rs.getInt("Sist_Seguridad"));
				currentInmueble.setSistemaSeguridad(rs.getString("O_Sist_Seguridad"));
				currentInmueble.setSuelosGres(rs.getInt("Suelos_Gres"));
				currentInmueble.setSuelosParquet(rs.getInt("Suelos_Parquet"));
				currentInmueble.setSuelosMarmol(rs.getInt("Suelos_Marmol"));
				currentInmueble.setSuelosTerrazo(rs.getInt("Suelos_Terrazo"));
				currentInmueble.setCarpinteriaInteriorRoble(rs.getInt("Carp_Interior_Roble"));
				currentInmueble.setCarpinteriaInteriorHaya(rs.getInt("Carp_Interior_Haya"));
				currentInmueble.setCarpinteriaInteriorSapelly(rs.getInt("Carp_Interior_Sapelly"));
				currentInmueble.setCarpinteriaInteriorLacada(rs.getInt("Carp_Interior_Lacada"));
				currentInmueble.setCarpinteriaInteriorMadera(rs.getInt("Carp_Interior_Madera"));
				currentInmueble.setCarpinteriaExteriorAluminio(rs.getInt("Carp_Exterior_Aluminio"));
				currentInmueble.setCarpinteriaExteriorMadera(rs.getInt("Carp_Exterior_Madera"));
				currentInmueble.setCarpinteriaExteriorPVC(rs.getInt("Carp_Exterior_PVC"));
				currentInmueble.setVidriosDoble(rs.getInt("Vidrios_Doble"));
				currentInmueble.setVidriosDoble(rs.getString("O_Vidrios_Doble"));
				currentInmueble.setOrientacionSur(rs.getInt("Orientacion_Sur"));
				currentInmueble.setOrientacionNorte(rs.getInt("Orientacion_Norte"));
				currentInmueble.setOrientacionEste(rs.getInt("Orientacion_Este"));
				currentInmueble.setOrientacionOeste(rs.getInt("Orientacion_Oeste"));
				currentInmueble.setSoleada(rs.getInt("Soleada"));
				currentInmueble.setSoleada(rs.getString("O_Soleada"));
				currentInmueble.setDistanciaPlaya(rs.getString("Dist_Playa"));
				currentInmueble.setGastoComunidad(rs.getInt("Gast_Comunidad"));
				currentInmueble.setAnyoConstruccion(rs.getString("Ano_Construccion"));
				currentInmueble.setOtros(rs.getString("Otros"));
				currentInmueble.setNombreFinca(rs.getString("Nombre Finca"));
				currentInmueble.setAltura(rs.getString("Altura"));
				currentInmueble.setSauna(rs.getInt("Sauna"));
				currentInmueble.setAscensor(rs.getInt("Ascensor"));
				currentInmueble.setActivo(rs.getInt("Activo"));
				
				inmuebles.add(currentInmueble);
			}
			c.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
		return inmuebles;
	}
	
	public String getZonaById(int zoneId) {
		Connection c;
		try {
			c = (Connection) pool.getConnection();
			PreparedStatement ps = (PreparedStatement) c.prepareStatement(this.getZonasSQL+" WHERE R_Zona = "+zoneId);
			ResultSet rs = ps.executeQuery();
			rs.next();
			String zona = rs.getString("Zona");
			c.close();
			return zona;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	public String getLocalidadByZoneId(int zoneId) {
		Connection c;
		try {
			c = (Connection) pool.getConnection();
			PreparedStatement ps = (PreparedStatement) c.prepareStatement(this.getZonasSQL+" WHERE R_Zona = "+zoneId);
			ResultSet rs = ps.executeQuery();
			rs.next();
			ps = (PreparedStatement) c.prepareStatement(this.getLocalidadesSQL+" WHERE R_Localidad = "+rs.getString("R_localidad"));
			rs = ps.executeQuery();
			rs.next();
			String localidad = rs.getString("Localidad");
			c.close();
			return localidad;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
}
